# 1.  封装一个类，提供2个方法：查询一条记录和执行 增删改 的sql
# 2.  把创建数据库连接和关闭数据库连接单独封装成方法
# 3.  创建数据库连接和关闭数据库连接，没有必要给用户使用，可以定义为私有方法
# 4.  为了用户更方便调用，不需要创建示例，直接使用查询方法，将所有的方法定位为类方法
import pymysql


class DB():
    conn = None
    # 打开数据库 不需要传入对象时直接调用类方法 没必要给用户使用 定义为私有方法
    @classmethod
    def __get_conn(cls):
        # 假如类对象不为空 则创建新的连接并返回
        if cls.conn==None:
            cls.conn=pymysql.connect(host="192.168.88.128", port=3306,user="root" , passwd="123456",
                       database="test_db", charset="utf8")
        return cls.conn
   # 关闭数据库
    @classmethod
    def __close_conn(cls):
        # 假如连接不是空 则关闭 如果不置0 调用2次关闭会报错
        if cls.conn is not None:
            cls.conn.close()
            cls.conn=None

    # 查询一条记录  如果需要传入sql对象操作 定义为实例方法
    @classmethod
    def select_one(cls,self):
        cursor=None
        result=None

        # 把数据库连接对象赋值给conn
        conn=cls.__get_conn()
        try:
            # 创建游标
            cursor=conn.cursor()
            # 执行数据库操作
            cursor.execute(self)
            # 把结果放到result里面
            result=cursor.fetchone()
        except Exception as e:
            print("发生查询错误",e)
            raise e
        finally:
            if cursor is not None:
                cursor.close()
            cls.__close_conn()
            return result

    # 执行增删改sql
    @classmethod
    def uid_db(cls,sql1):
        cursor=None
        result1=0
        conn=cls.__get_conn()
        try:
            cursor=conn.cursor()
            cursor.execute(sql1)

            conn.commit()
            result1=cursor.fetchall()

        except Exception as e:
            print("查询出了问题",e)
            if cls.conn:
                cls.conn.rollback()
            raise e
        finally:
             if cursor is not None:
                cursor.close()
                cls.__close_conn()
                return result1

if __name__ == '__main__':
    data=DB.select_one("select * from t_book")
    print(data)
    sql1="insert into t_book (id,title,pub_date) values(20,'打游戏','1998-05-04') "
    c=DB.uid_db(sql1)
    print(c)